package sentinel.demo.test.token;

import java.util.concurrent.TimeUnit;

public class SimpleLimiter1 {
    /**
     * 下一次令牌产生的时间（单位纳秒）
     */
    private long next = System.nanoTime();

    /**
     * 一秒
     * 1毫秒 = 1000微秒  1微秒 = 1000纳秒
     */
    private long speed = 1000_000_000;

    /**
     * 计算下一次令牌产生的时间（单位纳秒）
     * @param now
     * @return
     */
    private synchronized long reserve(long now){
        // 请求时间在下一次令牌产生之后 简单处理
        if (now > next){
            next = now;
        }
        // 能够获取令牌的时间
        long at = next;
        // 下一次令牌产生的时间
        next += speed;
        return at;
    }

    /**
     * 申请令牌
     */
    public void acquire(){
        long now = System.nanoTime();
        // 令牌产生时间
        long reserve = reserve(now);

        long waitTime = reserve-now;

        if (waitTime>0){
            try {
                TimeUnit.NANOSECONDS.sleep(waitTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
